﻿//using System;
//using Microsoft.Xna.Framework;
//using Microsoft.Xna.Framework.Graphics;
//using Phoenix.Xna.Framework.Components.Cameras;
//using Phoenix.Xna.Framework.FrameworkExtensions;
//using Phoenix.Xna.Framework.Graphics;

//namespace Phoenix.Xna.Framework.Components.Sky
//{
//    public class PerlinCloudsShader : Shader<SkyDomeShaderState>
//    {
//        private Texture2D _texture;

//        public Matrix World
//        {
//            get { return EffectMap.GetParameter<Matrix>("World"); }
//            set { EffectMap.SetParameter<Matrix>("World", value); }
//        }
//        public Matrix View
//        {
//            get { return EffectMap.GetParameter<Matrix>("View"); }
//            set { EffectMap.SetParameter<Matrix>("View", value); }
//        }
//        public Matrix Projection
//        {
//            get { return EffectMap.GetParameter<Matrix>("Projection"); }
//            set { EffectMap.SetParameter<Matrix>("Projection", value); }
//        }
//        public Texture2D Texture
//        {
//            get { return EffectMap.GetParameter<Texture2D>("Texture"); }
//            set { EffectMap.SetParameter<Texture2D>("Texture", value); }
//        }
//        public float Time
//        {
//            get { return EffectMap.GetParameter<float>("Time"); }
//            set { EffectMap.SetParameter<float>("Time", value); }
//        }
//        public Vector4 SunlightColor
//        {
//            get { return EffectMap.GetParameter<Vector4>("SunlightColor"); }
//            set { EffectMap.SetParameter<Vector4>("SunlightColor", value); }
//        }
//        public float CloudCover
//        {
//            get { return EffectMap.GetParameter<float>("CloudCover"); }
//            set { EffectMap.SetParameter<float>("CloudCover", value); }
//        }
//        public float CloudSharpness
//        {
//            get { return EffectMap.GetParameter<float>("CloudSharpness"); }
//            set { EffectMap.SetParameter<float>("CloudSharpness", value); }
//        }
//        public float Velocity { get; set; }
//        public QuadRenderer TextureRenderer { get; set; }

//         public PerlinCloudsShader(string effectMap)
//            : base(effectMap)
//        {
//            Initialize();
//        }

//        public PerlinCloudsShader(EffectMap effectMap)
//            : base(effectMap)
//        {
//            Initialize();
//        }

//        public PerlinCloudsShader(string id, string effectMap)
//            : base(id, effectMap)
//        {
//            Initialize();
//        }

//        public PerlinCloudsShader(string id, EffectMap effectMap)
//            : base(id, effectMap)
//        {
//            Initialize();
//        }

//        private void Initialize()
//        {
//            GenerateTexture();
//            Texture = _texture;
//            Velocity = EffectMap.GetVariable<float>("Velocity");
//        }

//        private void GenerateTexture()
//        {
//            int[] texture = { 151,160,137,91,90,15,
//                131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
//                190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
//                88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
//                77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
//                102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
//                135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
//                5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
//                223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
//                129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
//                251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
//                49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
//                138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180};
//            int[] gradient = { 1, 1, 0, -1, 1, 0, 
//                1, -1, 0, -1, -1, 0, 
//                1, 0, 1, -1, 0, 1, 
//                1, 0, -1, -1, 0, -1, 
//                0, 1, 1, 0, -1, 1, 
//                0, 1, -1, 0, -1, -1, 
//                1, 1, 0, 0, -1, 1, 
//                -1, 1, 0, 0, -1, -1};
//            _texture = new Texture2D(Engine.Instance.GraphicsDevice, 256, 256, 1, TextureUsage.None, SurfaceFormat.Color);
//            byte[] pixels;
//            pixels = new byte[256 * 256 * 4];

//            for (int i = 0; i < 256; i++)
//            {
//                for (int j = 0; j < 256; j++)
//                {
//                    int offset = (i * 256 + j) * 4;
//                    byte value = (byte)texture[(j + texture[i]) & 0xFF];
//                    pixels[offset + 1] = (byte)(gradient[value & 0x0F] * 64 + 64);
//                    pixels[offset + 2] = (byte)(gradient[value & 0x0F + 1] * 64 + 64);
//                    pixels[offset + 3] = (byte)(gradient[value & 0x0F + 2] * 64 + 64);
//                    pixels[offset] = value;
//                }
//            }

//            _texture.SetData<byte>(pixels);
//        }

//        #region Shader Members

//        public override void Draw(GameTime gameTime, SkyDomeShaderState state)
//        {
//            Engine.Instance.GraphicsDevice.RenderState.AlphaBlendEnable = true;
//            Engine.Instance.GraphicsDevice.RenderState.SourceBlend = Blend.One;
//            Engine.Instance.GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
//            EffectMap.SetTechnique("Render");
//            World = Matrix.CreateScale(10000.0f) *
//                Matrix.CreateTranslation(new Vector3(0, 0, -900)) *
//                Matrix.CreateRotationX((float)Math.PI / 2.0f) *
//                Matrix.CreateTranslation(Camera.ActiveCamera.Position);
//            View = Camera.ActiveCamera.View;
//            Projection = Camera.ActiveCamera.Projection;
//            Time = (float)gameTime.TotalGameTime.TotalSeconds / Velocity;
//            SunlightColor = new Vector4(state.SunlightColor, 1);

//            foreach (EffectPass p in EffectMap.Begin())
//            {
//                p.Begin();
//                TextureRenderer.Draw(gameTime);
//                p.End();
//            }

//            EffectMap.End();
//            Engine.Instance.GraphicsDevice.RenderState.AlphaBlendEnable = false;
//        }

//        #endregion
//    }
//}
